package fair.dao;

import fair.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/*
  @author fair_wu
 * @version v1.0
 * @date 2021-02-16 下午 12:01
 */

/**
 * JpaRepository<操作的实体类类型， 实体类中主键属性的类型>
 * JpaSpecificationExecutor<操作的实体类类型>
 */
public interface CustomerDao extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {

    /**
     * jpql的查询方式
     * 		jpql ： jpa query language  （jpq查询语言）
     * 		特点：语法或关键字和sql语句类似
     * 			查询的是类和类中的属性
     *
     * 		* 需要将JPQL语句配置到接口方法上
     * 			1.特有的查询：需要在dao接口上配置方法
     * 			2.在新添加的方法上，使用注解的形式配置jpql查询语句
     * 			3.注解 ： @Query
     * @param custName
     * @return
     */
    @Query(value = "from Customer where custName = ?1")
    public Customer findJpql(String custName);

    @Query(value = "from Customer where custName = ?1 and custId = ?2")
    public Customer findCustIdAndName(String custName, Long custId);

    @Query(value = "update Customer set custName = ?1 where custId = ?2")
    @Modifying
    public void updateCustomer(String custName, Long custId);

    /**
     * sql语句的查询
     * 		1.特有的查询：需要在dao接口上配置方法
     * 		2.在新添加的方法上，使用注解的形式配置sql查询语句
     * 		3.注解 ： @Query
     * 			value ：jpql语句 | sql语句
     * 			nativeQuery ：false（使用jpql查询） | true（使用本地查询：sql查询）
     * 				是否使用本地查询
     *
     */
    @Query(value = "select  * from cst_customer", nativeQuery = true)
    public List<Customer> findAll();

    /**
     * 方法名称规则查询
     * 	*是对jpql查询，更加深入一层的封装
     * 	*我们只需要按照SpringDataJpa提供的方法名称规则定义方法，不需要再配置jpql语句，完成查询
     * 	*
     * 		findBy开头：	代表查询
     * 			对象中属性名称（首字母大写）
     * 		*含义：根据属性名称进行查询
     * 	findBy + 属性名称（==）
     * 	findBy + 属性名称 + “查询方式（Like | isnull）”
     * 	findBy + 属性名称 + “查询方式（Like | isnull）” + 多条件连接符（and|or） + 属性名 + “查询方式（Like | isnull）”
     */
    public Customer findByCustName(String custName);

    public List<Customer> findByCustNameLike(String custName);
}
